package acmcoder360;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class Solution2 {
//A和B两个人在抽奖。现在有一个抽奖箱，里面有n张中奖票，m张不中奖票。A和B轮流从中抽一张奖票出来。如果有人抽到中奖票就结束，抽到中奖票的人胜利。抽过的奖票会被丢弃。
//额外的，B每次抽后，会再次抽取一张票并丢弃掉（这张票中奖不算B胜利）。
//现在，A先抽，请问A的胜率，保留4位小数后输出。
//如果两人到最后也没有抽到中奖票算作B胜利。
//输入描述
//输入两个数字n,m，代表中奖票和不中奖票的数量 (0≤n,m≤1000)
//输出描述
//输出A的胜率，保留4位小数。
//样例输入
//2 3
//样例输出
//0.6000
//总结 a始终>=1, b=1时，返回thiswin(A抽到最后一个b就输)    b=2时，只有B第二次拿中的可能，b>=3时递归
    public float winA(float[][] record,float a,float b) {
        if(a==0){
            return 0;
        }
        if(b==0){
            return 1;
        }
        float thiswin=a/(a+b);
        if((a+b)<=3){
            return thiswin;
        }
        float b1=0;
        float b2=0;
        float temp=b/(a+b)*(b-1)/(a+b-1);//AB都没中奖
        if(b>=3){
            float result=record[(int)a][(int)b-3];
            if(result==-1){
                result=winA(record,a,b-3);
                record[(int)a][(int)b-3]=result;
            }
            b1=temp*(b-2)/(a+b-2)*result;//B二次没中
        }
        if(b>=2){
            float result=record[(int)a-1][(int)b-2];
            if(result==-1){
                result=winA(record,a-1,b-2);
                record[(int)a-1][(int)b-2]=result;
            }
            b2=temp*(a)/(a+b-2)*result;//B第二次拿中了
        }
        return thiswin+b1+b2;
    }
//}
//public class Main {//赛码网格式要求
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a=scanner.nextInt();
        int b=scanner.nextInt();
        Solution2 s = new Solution2();
        float[][] record=new float[a+1][b+1];//用数组减少递归
        for(int i=0;i<=a;i++){
            for(int j=0;j<=b;j++){
                record[i][j]=-1;
            }
        }
        float result=s.winA(record,a,b);
        System.out.printf("%.4f",result);
    }
}
